package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import mx.ipn.persistencia.FabricaDeDAOs;
import mx.ipn.persistencia.dao.BitacoraAsistenciaDAO;
import mx.ipn.persistencia.dao.MotivoDAO;
import mx.ipn.persistencia.dao.UsuarioDAO;
import mx.ipn.persistencia.dao.EmpleadoDAO;
import mx.ipn.to.BitacoraAsistenciaTO;
import mx.ipn.to.MotivoTO;
import mx.ipn.to.EmpleadoTO;
import mx.ipn.to.UsuarioTO;
import mx.ipn.to.FechaHoraTO;

public class BitacoraAsistenciaDAOMySQL implements BitacoraAsistenciaDAO {
	static {
		FabricaDeDAOsMySQL.iniciaLog(BitacoraAsistenciaDAOMySQL.class);
	}

	private static final String INSERT = "INSERT INTO bitacora_asistencia (fecha,descripcion,id_motivo,id_empleado,id_usuario) VALUES(?,?,?,?,?)";

	private static final String DELETE = "DELETE FROM bitacora_asistencia WHERE id_operacion=?";

	private static final String UPDATE = "UPDATE bitacora_asistencia SET fecha=?,descripcion=?,id_motivo=?,id_empleado=?,id_usuario=? WHERE id_operacion=?";

	private static final String CONSIDERAR = "UPDATE bitacora_asistencia SET considerada=? WHERE id_operacion=?";

	private static final String FINDBYID = "SELECT * FROM bitacora_asistencia WHERE id_operacion=?";

	private static final String FINDBYFECHAEMPLEADOCONSIERADA = "SELECT * FROM bitacora_asistencia WHERE fecha=? AND id_empleado=? AND considerada=?";

	private static final String SELECT = "SELECT * FROM bitacora_asistencia";

	private static final String SELECTBYRANGOFECHA = "SELECT * FROM bitacora_asistencia WHERE fecha>=? AND fecha<=?";

	private static final String SELECTBYRANGOFECHAEMPLEADO = "SELECT * FROM bitacora_asistencia WHERE fecha>=? AND fecha<=? AND id_empleado=?";

	private static final String SELECTBYRANGOFECHAEMPLEADOCONSIDERADA = "SELECT * FROM bitacora_asistencia WHERE fecha>=? AND fecha<=? AND id_empleado=? AND considerada =?";
	private static final String SELECTBYRANGOFECHAEMPLEADOMOTIVOCONSIDERADA = "SELECT * FROM bitacora_asistencia WHERE fecha>=? AND fecha<=? AND id_empleado=? AND id_motivo=? AND considerada =?";

	private static final String SELECTBYRANGOFECHAMOTIVO = "SELECT * FROM bitacora_asistencia WHERE fecha>=? AND fecha<=? AND id_motivo=?";

	private static final String SELECTBYRANGOFECHAUSUARIO = "SELECT * FROM bitacora_asistencia WHERE fecha>=? AND fecha<=? AND id_usuario=?";

	private static final String SELECTBYRANGOFECHAMOTIVOEMPLEADO = "SELECT * FROM bitacora_asistencia WHERE fecha>=? AND fecha<=? AND id_motivo=? AND id_empleado=?";

	@Override
	public BitacoraAsistenciaTO findBitacoraAsistenciaById(int idOperacion) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYID);

			ps.setInt(1, idOperacion);

			ResultSet rs = ps.executeQuery();
			FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
			UsuarioDAO usuarioDAO = fabricaMySQL.getUsuarioDAO();
			MotivoDAO motivoDAO = fabricaMySQL.getMotivoDAO();
			EmpleadoDAO empleadoDAO = fabricaMySQL.getEmpleadoDAO();

			if (rs.next()) {
				idOperacion = rs.getInt("id_operacion");
				java.sql.Date fecha = rs.getDate("fecha");
				String descripcion = rs.getString("descripcion");
				boolean considerada = rs.getBoolean("considerada");

				ArrayList<MotivoTO> listMotivoTO = new ArrayList<MotivoTO>();
				ArrayList<EmpleadoTO> listEmpleadoTO = new ArrayList<EmpleadoTO>();
				ArrayList<UsuarioTO> listUsuarioTO = new ArrayList<UsuarioTO>();

				MotivoTO motivoTO = motivoDAO.findMotivoById(rs
						.getInt("id_motivo"));
				EmpleadoTO empleadoTO = empleadoDAO.findEmpleadoById(rs
						.getInt("id_empleado"));
				UsuarioTO usuarioTO = usuarioDAO.findUsuarioById(rs
						.getInt("id_usuario"));

				listMotivoTO.add(motivoTO);
				listEmpleadoTO.add(empleadoTO);
				listUsuarioTO.add(usuarioTO);

				EmpleadoTO[] arrEmpleadoTO = (EmpleadoTO[]) listEmpleadoTO
						.toArray(new EmpleadoTO[listEmpleadoTO.size()]);
				UsuarioTO[] arrUsuarioTO = (UsuarioTO[]) listUsuarioTO
						.toArray(new UsuarioTO[listUsuarioTO.size()]);
				MotivoTO[] arrMotivoTO = (MotivoTO[]) listMotivoTO
						.toArray(new MotivoTO[listMotivoTO.size()]);

				BitacoraAsistenciaTO bitacoraAsistenciaTO = new BitacoraAsistenciaTO(
						idOperacion, fecha, descripcion, arrMotivoTO,
						arrEmpleadoTO, arrUsuarioTO, considerada);

				ps.close();
				conexion.close();
				return bitacoraAsistenciaTO;
			}
			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public BitacoraAsistenciaTO findBitacoraAsistenciaByFechaEmpleadoConsiderada(
			Date fecha, int idEmpleado, boolean considerada) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion
					.prepareStatement(FINDBYFECHAEMPLEADOCONSIERADA);

			ps.setDate(1, fecha);
			ps.setInt(2, idEmpleado);
			ps.setBoolean(3, considerada);

			ResultSet rs = ps.executeQuery();
			FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
			UsuarioDAO usuarioDAO = fabricaMySQL.getUsuarioDAO();
			MotivoDAO motivoDAO = fabricaMySQL.getMotivoDAO();
			EmpleadoDAO empleadoDAO = fabricaMySQL.getEmpleadoDAO();

			if (rs.next()) {
				int idOperacion = rs.getInt("id_operacion");
				fecha = rs.getDate("fecha");
				String descripcion = rs.getString("descripcion");
				considerada = rs.getBoolean("considerada");

				ArrayList<MotivoTO> listMotivoTO = new ArrayList<MotivoTO>();
				ArrayList<EmpleadoTO> listEmpleadoTO = new ArrayList<EmpleadoTO>();
				ArrayList<UsuarioTO> listUsuarioTO = new ArrayList<UsuarioTO>();

				MotivoTO motivoTO = motivoDAO.findMotivoById(rs
						.getInt("id_motivo"));
				EmpleadoTO empleadoTO = empleadoDAO.findEmpleadoById(rs
						.getInt("id_empleado"));
				UsuarioTO usuarioTO = usuarioDAO.findUsuarioById(rs
						.getInt("id_usuario"));

				listMotivoTO.add(motivoTO);
				listEmpleadoTO.add(empleadoTO);
				listUsuarioTO.add(usuarioTO);

				EmpleadoTO[] arrEmpleadoTO = (EmpleadoTO[]) listEmpleadoTO
						.toArray(new EmpleadoTO[listEmpleadoTO.size()]);
				UsuarioTO[] arrUsuarioTO = (UsuarioTO[]) listUsuarioTO
						.toArray(new UsuarioTO[listUsuarioTO.size()]);
				MotivoTO[] arrMotivoTO = (MotivoTO[]) listMotivoTO
						.toArray(new MotivoTO[listMotivoTO.size()]);

				BitacoraAsistenciaTO bitacoraAsistenciaTO = new BitacoraAsistenciaTO(
						idOperacion, fecha, descripcion, arrMotivoTO,
						arrEmpleadoTO, arrUsuarioTO, considerada);

				ps.close();
				conexion.close();
				return bitacoraAsistenciaTO;
			}
			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public int insertBitacoraAsistencia(
			BitacoraAsistenciaTO bitacoraAsistenciaTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps
					.setDate(1, FechaHoraTO.getFecha(bitacoraAsistenciaTO
							.getFecha()));
			ps.setString(2, bitacoraAsistenciaTO.getDescripcion());
			ps.setInt(3, bitacoraAsistenciaTO.getIdMotivo());
			ps.setInt(4, bitacoraAsistenciaTO.getIdEmpleado());
			ps.setInt(5, bitacoraAsistenciaTO.getIdUsuario());

			ps.executeUpdate();
			// atrapa el indice del campo agregado
			int autoIncIndice = -1;
			ResultSet rs = ps.getGeneratedKeys();

			if (rs.next()) {
				autoIncIndice = rs.getInt(1);
			} else {
				System.err.print("No se pudo agregar campo");
				return 0;
			}

			ps.close();
			conexion.close();

			return autoIncIndice;
		} catch (Exception e) {
			e.printStackTrace();
			return -1;
		}
	}

	@Override
	public ArrayList<BitacoraAsistenciaTO> selectBitacoraAsistencia() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();
			FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

			MotivoDAO motivoDAO = fabricaMySQL.getMotivoDAO();
			EmpleadoDAO empleadoDAO = fabricaMySQL.getEmpleadoDAO();
			UsuarioDAO usuarioDAO = fabricaMySQL.getUsuarioDAO();

			ArrayList<BitacoraAsistenciaTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<BitacoraAsistenciaTO>();

				int idOperacion = rs.getInt("id_operacion");
				java.sql.Date fecha = rs.getDate("fecha");
				String descripcion = rs.getString("descripcion");
				boolean considerada = rs.getBoolean("considerada");

				ArrayList<MotivoTO> listMotivoTO = new ArrayList<MotivoTO>();
				ArrayList<EmpleadoTO> listEmpleadoTO = new ArrayList<EmpleadoTO>();
				ArrayList<UsuarioTO> listUsuarioTO = new ArrayList<UsuarioTO>();

				MotivoTO motivoTO = motivoDAO.findMotivoById(rs
						.getInt("id_motivo"));
				EmpleadoTO empleadoTO = empleadoDAO.findEmpleadoById(rs
						.getInt("id_empleado"));
				UsuarioTO usuarioTO = usuarioDAO.findUsuarioById(rs
						.getInt("id_usuario"));

				listMotivoTO.add(motivoTO);
				listEmpleadoTO.add(empleadoTO);
				listUsuarioTO.add(usuarioTO);

				EmpleadoTO[] arrEmpleadoTO = (EmpleadoTO[]) listEmpleadoTO
						.toArray(new EmpleadoTO[listEmpleadoTO.size()]);
				UsuarioTO[] arrUsuarioTO = (UsuarioTO[]) listUsuarioTO
						.toArray(new UsuarioTO[listUsuarioTO.size()]);
				MotivoTO[] arrMotivoTO = (MotivoTO[]) listMotivoTO
						.toArray(new MotivoTO[listMotivoTO.size()]);

				BitacoraAsistenciaTO bitacoraAsistenciaTO = new BitacoraAsistenciaTO(
						idOperacion, fecha, descripcion, arrMotivoTO,
						arrEmpleadoTO, arrUsuarioTO, considerada);

				coleccion.add(bitacoraAsistenciaTO);
			}
			ps.close();
			conexion.close();

			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<BitacoraAsistenciaTO> selectByRangoFecha(Date inicio,
			Date fin) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYRANGOFECHA);

			ps.setDate(1, inicio);
			ps.setDate(2, fin);

			ResultSet rs = ps.executeQuery();
			FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
					.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

			MotivoDAO motivoDAO = fabricaMySQL.getMotivoDAO();
			EmpleadoDAO empleadoDAO = fabricaMySQL.getEmpleadoDAO();
			UsuarioDAO usuarioDAO = fabricaMySQL.getUsuarioDAO();

			ArrayList<BitacoraAsistenciaTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<BitacoraAsistenciaTO>();

				int idOperacion = rs.getInt("id_operacion");
				java.sql.Date fecha = rs.getDate("fecha");
				String descripcion = rs.getString("descripcion");
				boolean considerada = rs.getBoolean("considerada");

				ArrayList<MotivoTO> listMotivoTO = new ArrayList<MotivoTO>();
				ArrayList<EmpleadoTO> listEmpleadoTO = new ArrayList<EmpleadoTO>();
				ArrayList<UsuarioTO> listUsuarioTO = new ArrayList<UsuarioTO>();

				MotivoTO motivoTO = motivoDAO.findMotivoById(rs
						.getInt("id_motivo"));
				EmpleadoTO empleadoTO = empleadoDAO.findEmpleadoById(rs
						.getInt("id_empleado"));
				UsuarioTO usuarioTO = usuarioDAO.findUsuarioById(rs
						.getInt("id_usuario"));

				listMotivoTO.add(motivoTO);
				listEmpleadoTO.add(empleadoTO);
				listUsuarioTO.add(usuarioTO);

				EmpleadoTO[] arrEmpleadoTO = (EmpleadoTO[]) listEmpleadoTO
						.toArray(new EmpleadoTO[listEmpleadoTO.size()]);
				UsuarioTO[] arrUsuarioTO = (UsuarioTO[]) listUsuarioTO
						.toArray(new UsuarioTO[listUsuarioTO.size()]);
				MotivoTO[] arrMotivoTO = (MotivoTO[]) listMotivoTO
						.toArray(new MotivoTO[listMotivoTO.size()]);

				BitacoraAsistenciaTO bitacoraAsistenciaTO = new BitacoraAsistenciaTO(
						idOperacion, fecha, descripcion, arrMotivoTO,
						arrEmpleadoTO, arrUsuarioTO, considerada);

				coleccion.add(bitacoraAsistenciaTO);
			}
			ps.close();
			conexion.close();

			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public BitacoraAsistenciaTO selectByRangoFechaEmpleadoConsiderada(
			Date inicioFecha, Date finFecha, int idEmpleado, boolean considerada) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			FabricaDeDAOs fabricaMySQL = null;

			MotivoDAO motivoDAO = null;
			EmpleadoDAO empleadoDAO = null;
			UsuarioDAO usuarioDAO = null;

			ArrayList<Integer> listIdOperacion = null;
			ArrayList<java.sql.Date> listFecha = null;
			ArrayList<String> listDescripcion = null;
			ArrayList<MotivoTO> listMotivoTO = null;
			ArrayList<EmpleadoTO> listEmpleadoTO = null;
			ArrayList<UsuarioTO> listUsuarioTO = null;
			ArrayList<Boolean> listConsiderada = null;

			BitacoraAsistenciaTO bitacoraAsistenciaTO = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYRANGOFECHAEMPLEADOCONSIDERADA);
			ps.setDate(1, inicioFecha);
			ps.setDate(2, finFecha);
			ps.setInt(3, idEmpleado);
			ps.setBoolean(4, considerada);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdOperacion == null) {

					listIdOperacion = new ArrayList<Integer>();
					listFecha = new ArrayList<java.sql.Date>();
					listDescripcion = new ArrayList<String>();
					listMotivoTO = new ArrayList<MotivoTO>();
					listEmpleadoTO = new ArrayList<EmpleadoTO>();
					listUsuarioTO = new ArrayList<UsuarioTO>();
					listConsiderada = new ArrayList<Boolean>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					motivoDAO = fabricaMySQL.getMotivoDAO();
					empleadoDAO = fabricaMySQL.getEmpleadoDAO();
					usuarioDAO = fabricaMySQL.getUsuarioDAO();

				}
				listIdOperacion.add(rs.getInt("id_operacion"));
				listFecha.add(rs.getDate("fecha"));
				listDescripcion.add(rs.getString("descripcion"));
				listMotivoTO.add(motivoDAO.findMotivoById(rs
						.getInt("id_motivo")));
				listUsuarioTO.add(usuarioDAO.findUsuarioById(rs
						.getInt("id_usuario")));
				listConsiderada.add(rs.getBoolean("considerada"));
			}
			if (listIdOperacion != null) {
				listEmpleadoTO.add(empleadoDAO.findEmpleadoById(idEmpleado));

				EmpleadoTO[] arrEmpleadoTO = (EmpleadoTO[]) listEmpleadoTO
						.toArray(new EmpleadoTO[listEmpleadoTO.size()]);
				UsuarioTO[] arrUsuarioTO = (UsuarioTO[]) listUsuarioTO
						.toArray(new UsuarioTO[listUsuarioTO.size()]);
				MotivoTO[] arrMotivoTO = (MotivoTO[]) listMotivoTO
						.toArray(new MotivoTO[listMotivoTO.size()]);
				Integer[] arrIdOperacion = (Integer[]) listIdOperacion
						.toArray(new Integer[listIdOperacion.size()]);
				Date[] arrFecha = (Date[]) listFecha.toArray(new Date[listFecha
						.size()]);
				String[] arrDescripcion = (String[]) listDescripcion
						.toArray(new String[listDescripcion.size()]);
				Boolean[] arrConsiderada = (Boolean[]) listConsiderada
						.toArray(new Boolean[listConsiderada.size()]);

				bitacoraAsistenciaTO = new BitacoraAsistenciaTO(arrIdOperacion,
						arrFecha, arrDescripcion, arrMotivoTO, arrEmpleadoTO,
						arrUsuarioTO, arrConsiderada);
			}
			ps.close();
			conexion.close();
			return bitacoraAsistenciaTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public BitacoraAsistenciaTO selectByRangoFechaEmpleadoMotivoConsiderada(
			Date inicioFecha, Date finFecha, int idEmpleado, int idMotivo,
			boolean considerada) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			FabricaDeDAOs fabricaMySQL = null;

			MotivoDAO motivoDAO = null;
			EmpleadoDAO empleadoDAO = null;
			UsuarioDAO usuarioDAO = null;

			ArrayList<Integer> listIdOperacion = null;
			ArrayList<java.sql.Date> listFecha = null;
			ArrayList<String> listDescripcion = null;
			ArrayList<MotivoTO> listMotivoTO = null;
			ArrayList<EmpleadoTO> listEmpleadoTO = null;
			ArrayList<UsuarioTO> listUsuarioTO = null;
			ArrayList<Boolean> listConsiderada = null;

			BitacoraAsistenciaTO bitacoraAsistenciaTO = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYRANGOFECHAEMPLEADOMOTIVOCONSIDERADA);
			ps.setDate(1, inicioFecha);
			ps.setDate(2, finFecha);
			ps.setInt(3, idEmpleado);
			ps.setInt(4, idMotivo);
			ps.setBoolean(5, considerada);
			

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdOperacion == null) {

					listIdOperacion = new ArrayList<Integer>();
					listFecha = new ArrayList<java.sql.Date>();
					listDescripcion = new ArrayList<String>();
					listMotivoTO = new ArrayList<MotivoTO>();
					listEmpleadoTO = new ArrayList<EmpleadoTO>();
					listUsuarioTO = new ArrayList<UsuarioTO>();
					listConsiderada = new ArrayList<Boolean>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					motivoDAO = fabricaMySQL.getMotivoDAO();
					empleadoDAO = fabricaMySQL.getEmpleadoDAO();
					usuarioDAO = fabricaMySQL.getUsuarioDAO();

				}
				listIdOperacion.add(rs.getInt("id_operacion"));
				listFecha.add(rs.getDate("fecha"));
				listDescripcion.add(rs.getString("descripcion"));
				listMotivoTO.add(motivoDAO.findMotivoById(rs
						.getInt("id_motivo")));
				listUsuarioTO.add(usuarioDAO.findUsuarioById(rs
						.getInt("id_usuario")));
				listConsiderada.add(rs.getBoolean("considerada"));
			}
			if (listIdOperacion != null) {
				listEmpleadoTO.add(empleadoDAO.findEmpleadoById(idEmpleado));

				EmpleadoTO[] arrEmpleadoTO = (EmpleadoTO[]) listEmpleadoTO
						.toArray(new EmpleadoTO[listEmpleadoTO.size()]);
				UsuarioTO[] arrUsuarioTO = (UsuarioTO[]) listUsuarioTO
						.toArray(new UsuarioTO[listUsuarioTO.size()]);
				MotivoTO[] arrMotivoTO = (MotivoTO[]) listMotivoTO
						.toArray(new MotivoTO[listMotivoTO.size()]);
				Integer[] arrIdOperacion = (Integer[]) listIdOperacion
						.toArray(new Integer[listIdOperacion.size()]);
				Date[] arrFecha = (Date[]) listFecha.toArray(new Date[listFecha
						.size()]);
				String[] arrDescripcion = (String[]) listDescripcion
						.toArray(new String[listDescripcion.size()]);
				Boolean[] arrConsiderada = (Boolean[]) listConsiderada
						.toArray(new Boolean[listConsiderada.size()]);

				bitacoraAsistenciaTO = new BitacoraAsistenciaTO(arrIdOperacion,
						arrFecha, arrDescripcion, arrMotivoTO, arrEmpleadoTO,
						arrUsuarioTO, arrConsiderada);
			}
			ps.close();
			conexion.close();
			return bitacoraAsistenciaTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public BitacoraAsistenciaTO selectByRangoFechaEmpleado(Date inicioFecha,
			Date finFecha, int idEmpleado) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			FabricaDeDAOs fabricaMySQL = null;

			MotivoDAO motivoDAO = null;
			EmpleadoDAO empleadoDAO = null;
			UsuarioDAO usuarioDAO = null;

			ArrayList<Integer> listIdOperacion = null;
			ArrayList<java.sql.Date> listFecha = null;
			ArrayList<String> listDescripcion = null;
			ArrayList<MotivoTO> listMotivoTO = null;
			ArrayList<EmpleadoTO> listEmpleadoTO = null;
			ArrayList<UsuarioTO> listUsuarioTO = null;
			ArrayList<Boolean> listConsiderada = null;

			BitacoraAsistenciaTO bitacoraAsistenciaTO = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYRANGOFECHAEMPLEADO);
			ps.setDate(1, inicioFecha);
			ps.setDate(2, finFecha);
			ps.setInt(3, idEmpleado);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdOperacion == null) {

					listIdOperacion = new ArrayList<Integer>();
					listFecha = new ArrayList<java.sql.Date>();
					listDescripcion = new ArrayList<String>();
					listMotivoTO = new ArrayList<MotivoTO>();
					listEmpleadoTO = new ArrayList<EmpleadoTO>();
					listUsuarioTO = new ArrayList<UsuarioTO>();
					listConsiderada = new ArrayList<Boolean>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					motivoDAO = fabricaMySQL.getMotivoDAO();
					empleadoDAO = fabricaMySQL.getEmpleadoDAO();
					usuarioDAO = fabricaMySQL.getUsuarioDAO();

				}
				listIdOperacion.add(rs.getInt("id_operacion"));
				listFecha.add(rs.getDate("fecha"));
				listDescripcion.add(rs.getString("descripcion"));
				listMotivoTO.add(motivoDAO.findMotivoById(rs
						.getInt("id_motivo")));
				listUsuarioTO.add(usuarioDAO.findUsuarioById(rs
						.getInt("id_usuario")));
				listConsiderada.add(rs.getBoolean("considerada"));
			}
			if (listIdOperacion != null) {
				listEmpleadoTO.add(empleadoDAO.findEmpleadoById(idEmpleado));

				EmpleadoTO[] arrEmpleadoTO = (EmpleadoTO[]) listEmpleadoTO
						.toArray(new EmpleadoTO[listEmpleadoTO.size()]);
				UsuarioTO[] arrUsuarioTO = (UsuarioTO[]) listUsuarioTO
						.toArray(new UsuarioTO[listUsuarioTO.size()]);
				MotivoTO[] arrMotivoTO = (MotivoTO[]) listMotivoTO
						.toArray(new MotivoTO[listMotivoTO.size()]);
				Integer[] arrIdOperacion = (Integer[]) listIdOperacion
						.toArray(new Integer[listIdOperacion.size()]);
				Date[] arrFecha = (Date[]) listFecha.toArray(new Date[listFecha
						.size()]);
				String[] arrDescripcion = (String[]) listDescripcion
						.toArray(new String[listDescripcion.size()]);
				Boolean[] arrConsiderada = (Boolean[]) listConsiderada
						.toArray(new Boolean[listConsiderada.size()]);

				bitacoraAsistenciaTO = new BitacoraAsistenciaTO(arrIdOperacion,
						arrFecha, arrDescripcion, arrMotivoTO, arrEmpleadoTO,
						arrUsuarioTO, arrConsiderada);
			}
			ps.close();
			conexion.close();
			return bitacoraAsistenciaTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public BitacoraAsistenciaTO selectByRangoFechaMotivo(Date inicioFecha,
			Date finFecha, int idMotivo) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			FabricaDeDAOs fabricaMySQL = null;

			MotivoDAO motivoDAO = null;
			EmpleadoDAO empleadoDAO = null;
			UsuarioDAO usuarioDAO = null;

			ArrayList<Integer> listIdOperacion = null;
			ArrayList<java.sql.Date> listFecha = null;
			ArrayList<String> listDescripcion = null;
			ArrayList<MotivoTO> listMotivoTO = null;
			ArrayList<EmpleadoTO> listEmpleadoTO = null;
			ArrayList<UsuarioTO> listUsuarioTO = null;
			ArrayList<Boolean> listConsiderada = null;

			BitacoraAsistenciaTO bitacoraAsistenciaTO = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYRANGOFECHAMOTIVO);
			ps.setDate(1, inicioFecha);
			ps.setDate(2, finFecha);
			ps.setInt(3, idMotivo);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdOperacion == null) {

					listIdOperacion = new ArrayList<Integer>();
					listFecha = new ArrayList<java.sql.Date>();
					listDescripcion = new ArrayList<String>();
					listMotivoTO = new ArrayList<MotivoTO>();
					listEmpleadoTO = new ArrayList<EmpleadoTO>();
					listUsuarioTO = new ArrayList<UsuarioTO>();
					listConsiderada = new ArrayList<Boolean>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					motivoDAO = fabricaMySQL.getMotivoDAO();
					empleadoDAO = fabricaMySQL.getEmpleadoDAO();
					usuarioDAO = fabricaMySQL.getUsuarioDAO();

				}
				listIdOperacion.add(rs.getInt("id_operacion"));
				listFecha.add(rs.getDate("fecha"));
				listDescripcion.add(rs.getString("descripcion"));
				listEmpleadoTO.add(empleadoDAO.findEmpleadoById(rs
						.getInt("id_empleado")));
				listUsuarioTO.add(usuarioDAO.findUsuarioById(rs
						.getInt("id_usuario")));
				listConsiderada.add(rs.getBoolean("considerada"));
			}
			if (listIdOperacion != null) {
				listMotivoTO.add(motivoDAO.findMotivoById(idMotivo));

				EmpleadoTO[] arrEmpleadoTO = (EmpleadoTO[]) listEmpleadoTO
						.toArray(new EmpleadoTO[listEmpleadoTO.size()]);
				UsuarioTO[] arrUsuarioTO = (UsuarioTO[]) listUsuarioTO
						.toArray(new UsuarioTO[listUsuarioTO.size()]);
				MotivoTO[] arrMotivoTO = (MotivoTO[]) listMotivoTO
						.toArray(new MotivoTO[listMotivoTO.size()]);
				Integer[] arrIdOperacion = (Integer[]) listIdOperacion
						.toArray(new Integer[listIdOperacion.size()]);
				Date[] arrFecha = (Date[]) listFecha.toArray(new Date[listFecha
						.size()]);
				String[] arrDescripcion = (String[]) listDescripcion
						.toArray(new String[listDescripcion.size()]);
				Boolean[] arrConsiderada = (Boolean[]) listConsiderada
						.toArray(new Boolean[listConsiderada.size()]);

				bitacoraAsistenciaTO = new BitacoraAsistenciaTO(arrIdOperacion,
						arrFecha, arrDescripcion, arrMotivoTO, arrEmpleadoTO,
						arrUsuarioTO, arrConsiderada);

			}
			ps.close();
			conexion.close();
			return bitacoraAsistenciaTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public BitacoraAsistenciaTO selectByRangoFechaMotivoEmpleado(
			Date inicioFecha, Date finFecha, int idMotivo, int idEmpleado) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			FabricaDeDAOs fabricaMySQL = null;

			MotivoDAO motivoDAO = null;
			EmpleadoDAO empleadoDAO = null;
			UsuarioDAO usuarioDAO = null;

			ArrayList<Integer> listIdOperacion = null;
			ArrayList<java.sql.Date> listFecha = null;
			ArrayList<String> listDescripcion = null;
			ArrayList<MotivoTO> listMotivoTO = null;
			ArrayList<EmpleadoTO> listEmpleadoTO = null;
			ArrayList<UsuarioTO> listUsuarioTO = null;
			ArrayList<Boolean> listConsiderada = null;

			BitacoraAsistenciaTO bitacoraAsistenciaTO = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYRANGOFECHAMOTIVOEMPLEADO);
			ps.setDate(1, inicioFecha);
			ps.setDate(2, finFecha);
			ps.setInt(3, idMotivo);
			ps.setInt(4, idEmpleado);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdOperacion == null) {

					listIdOperacion = new ArrayList<Integer>();
					listFecha = new ArrayList<java.sql.Date>();
					listDescripcion = new ArrayList<String>();
					listMotivoTO = new ArrayList<MotivoTO>();
					listEmpleadoTO = new ArrayList<EmpleadoTO>();
					listUsuarioTO = new ArrayList<UsuarioTO>();
					listConsiderada = new ArrayList<Boolean>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					motivoDAO = fabricaMySQL.getMotivoDAO();
					empleadoDAO = fabricaMySQL.getEmpleadoDAO();
					usuarioDAO = fabricaMySQL.getUsuarioDAO();

				}
				listIdOperacion.add(rs.getInt("id_operacion"));
				listFecha.add(rs.getDate("fecha"));
				listDescripcion.add(rs.getString("descripcion"));

				listUsuarioTO.add(usuarioDAO.findUsuarioById(rs
						.getInt("id_usuario")));
				listConsiderada.add(rs.getBoolean("considerada"));
			}
			if (listIdOperacion != null) {
				listMotivoTO.add(motivoDAO.findMotivoById(idMotivo));
				listEmpleadoTO.add(empleadoDAO.findEmpleadoById(idEmpleado));

				EmpleadoTO[] arrEmpleadoTO = (EmpleadoTO[]) listEmpleadoTO
						.toArray(new EmpleadoTO[listEmpleadoTO.size()]);
				UsuarioTO[] arrUsuarioTO = (UsuarioTO[]) listUsuarioTO
						.toArray(new UsuarioTO[listUsuarioTO.size()]);
				MotivoTO[] arrMotivoTO = (MotivoTO[]) listMotivoTO
						.toArray(new MotivoTO[listMotivoTO.size()]);
				Integer[] arrIdOperacion = (Integer[]) listIdOperacion
						.toArray(new Integer[listIdOperacion.size()]);
				Date[] arrFecha = (Date[]) listFecha.toArray(new Date[listFecha
						.size()]);
				String[] arrDescripcion = (String[]) listDescripcion
						.toArray(new String[listDescripcion.size()]);
				Boolean[] arrConsiderada = (Boolean[]) listConsiderada
						.toArray(new Boolean[listConsiderada.size()]);

				bitacoraAsistenciaTO = new BitacoraAsistenciaTO(arrIdOperacion,
						arrFecha, arrDescripcion, arrMotivoTO, arrEmpleadoTO,
						arrUsuarioTO, arrConsiderada);

			}
			ps.close();
			conexion.close();
			return bitacoraAsistenciaTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public BitacoraAsistenciaTO selectByRangoFechaUsuario(Date inicioFecha,
			Date finFecha, int idUsuario) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			FabricaDeDAOs fabricaMySQL = null;

			MotivoDAO motivoDAO = null;
			EmpleadoDAO empleadoDAO = null;
			UsuarioDAO usuarioDAO = null;

			ArrayList<Integer> listIdOperacion = null;
			ArrayList<java.sql.Date> listFecha = null;
			ArrayList<String> listDescripcion = null;
			ArrayList<MotivoTO> listMotivoTO = null;
			ArrayList<EmpleadoTO> listEmpleadoTO = null;
			ArrayList<UsuarioTO> listUsuarioTO = null;
			ArrayList<Boolean> listConsiderada = null;

			BitacoraAsistenciaTO bitacoraAsistenciaTO = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYRANGOFECHAUSUARIO);
			ps.setDate(1, inicioFecha);
			ps.setDate(2, finFecha);
			ps.setInt(3, idUsuario);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdOperacion == null) {

					listIdOperacion = new ArrayList<Integer>();
					listFecha = new ArrayList<java.sql.Date>();
					listDescripcion = new ArrayList<String>();
					listMotivoTO = new ArrayList<MotivoTO>();
					listEmpleadoTO = new ArrayList<EmpleadoTO>();
					listUsuarioTO = new ArrayList<UsuarioTO>();
					listConsiderada = new ArrayList<Boolean>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					motivoDAO = fabricaMySQL.getMotivoDAO();
					empleadoDAO = fabricaMySQL.getEmpleadoDAO();
					usuarioDAO = fabricaMySQL.getUsuarioDAO();

				}
				listIdOperacion.add(rs.getInt("id_operacion"));
				listFecha.add(rs.getDate("fecha"));
				listDescripcion.add(rs.getString("descripcion"));
				listEmpleadoTO.add(empleadoDAO.findEmpleadoById(rs
						.getInt("id_empleado")));
				listMotivoTO.add(motivoDAO.findMotivoById(rs
						.getInt("id_motivo")));
			}
			if (listIdOperacion != null) {
				listUsuarioTO.add(usuarioDAO.findUsuarioById(idUsuario));

				EmpleadoTO[] arrEmpleadoTO = (EmpleadoTO[]) listEmpleadoTO
						.toArray(new EmpleadoTO[listEmpleadoTO.size()]);
				UsuarioTO[] arrUsuarioTO = (UsuarioTO[]) listUsuarioTO
						.toArray(new UsuarioTO[listUsuarioTO.size()]);
				MotivoTO[] arrMotivoTO = (MotivoTO[]) listMotivoTO
						.toArray(new MotivoTO[listMotivoTO.size()]);
				Integer[] arrIdOperacion = (Integer[]) listIdOperacion
						.toArray(new Integer[listIdOperacion.size()]);
				Date[] arrFecha = (Date[]) listFecha.toArray(new Date[listFecha
						.size()]);
				String[] arrDescripcion = (String[]) listDescripcion
						.toArray(new String[listDescripcion.size()]);
				Boolean[] arrConsiderada = (Boolean[]) listConsiderada
						.toArray(new Boolean[listConsiderada.size()]);

				bitacoraAsistenciaTO = new BitacoraAsistenciaTO(arrIdOperacion,
						arrFecha, arrDescripcion, arrMotivoTO, arrEmpleadoTO,
						arrUsuarioTO, arrConsiderada);

			}
			ps.close();
			conexion.close();
			return bitacoraAsistenciaTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public short considerarBitacoraAsistencia(boolean considerar,
			int idOperacion) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(CONSIDERAR);

			ps.setBoolean(1, considerar);
			ps.setInt(2, idOperacion);

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			} else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}

	}

	@Override
	public short updateBitacoraAsistencia(
			BitacoraAsistenciaTO bitacoraAsistenciaTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(UPDATE);

			ps
					.setDate(1, FechaHoraTO.getFecha(bitacoraAsistenciaTO
							.getFecha()));
			ps.setString(2, bitacoraAsistenciaTO.getDescripcion());
			ps.setInt(3, bitacoraAsistenciaTO.getIdMotivo());
			ps.setInt(4, bitacoraAsistenciaTO.getIdEmpleado());
			ps.setInt(5, bitacoraAsistenciaTO.getIdUsuario());

			ps.setInt(6, bitacoraAsistenciaTO.getIdOperacion());

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			} else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

	@Override
	public short deleteBitacoraAsistencia(int idOperacion) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(DELETE);

			ps.setInt(1, idOperacion);

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			} else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

}
